package com.bp.system.service.impl;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Objects;

import com.bp.common.config.GlobalConfig;
import com.bp.common.exception.file.FileNameLengthLimitExceededException;
import com.bp.common.exception.file.FileSizeLimitExceededException;
import com.bp.common.exception.file.InvalidExtensionException;
import com.bp.common.utils.DateUtils;
import javax.annotation.Resource;

import com.bp.common.utils.file.FileUploadUtils;
import org.springframework.stereotype.Service;
import com.bp.system.mapper.SysFileMapper;
import com.bp.system.domain.SysFileDomain;
import com.bp.system.service.ISysFileService;
import org.springframework.web.multipart.MultipartFile;

/**
 * 文件存储Service业务层处理
 *
 * @author shaominjie
 * @date 2021-01-13
 */
@Service
public class SysFileServiceImpl implements ISysFileService {
    @Resource
    private SysFileMapper sysFileMapper;

    /**
     * 查询文件存储
     *
     * @param fileId 文件存储ID
     * @return 文件存储
     */
    @Override
    public SysFileDomain selectById(Long fileId) {
        return sysFileMapper.selectById(fileId);
    }

    /**
     * 查询文件存储列表
     *
     * @param sysFileDomain 文件存储
     * @return 文件存储
     */
    @Override
    public List<SysFileDomain> selectList(SysFileDomain sysFileDomain) {
        return sysFileMapper.selectList(sysFileDomain);
    }
    /**
     * 查询文件存储列表-包含下级
     *
     * @param sysFileDomain 文件存储
     * @return 文件存储
     */
    @Override
    public List<SysFileDomain> selectListWithChild(SysFileDomain sysFileDomain) {
        return sysFileMapper.selectListWithChild(sysFileDomain);
    }
    /**
     * 新增文件存储
     *
     * @param sysFileDomain 文件存储
     * @return 结果
     */
    @Override
    public int insert(SysFileDomain sysFileDomain) {
        sysFileDomain.setCreateTime(DateUtils.getNowDate());
        return sysFileMapper.insert(sysFileDomain);
    }

    /**
     * 修改文件存储
     *
     * @param sysFileDomain 文件存储
     * @return 结果
     */
    @Override
    public int update(SysFileDomain sysFileDomain) {
        sysFileDomain.setUpdateTime(DateUtils.getNowDate());
        return sysFileMapper.update(sysFileDomain);
    }

    /**
     * 批量删除文件存储
     *
     * @param fileIds 需要删除的文件存储ID
     * @return 结果
     */
    @Override
    public int deleteByIds(Long[] fileIds) {
        return sysFileMapper.deleteByIds(fileIds);
    }

    /**
     * 删除文件存储信息
     *
     * @param fileId 文件存储ID
     * @return 结果
     */
    @Override
    public int deleteById(Long fileId) {
        return sysFileMapper.deleteById(fileId);
    }

    /**
     * 获取当前目录下的文件
     *
     * @param indexId
     * @return
     */
    @Override
    public List<SysFileDomain> selectByIndexId(Long indexId) {
        return sysFileMapper.selectByIndexId(indexId);
    }


    @Override
    public String upload(String baseDir, MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
            InvalidExtensionException {
        int fileNameLength = Objects.requireNonNull(file.getOriginalFilename()).length();
        if (fileNameLength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) {
            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
        }
        // 文件大小校验
        FileUploadUtils.assertAllowed(file, allowedExtension);

        String fileName = file.getOriginalFilename();

        File desc = FileUploadUtils.getAbsoluteFile(GlobalConfig.getProfile()+baseDir, fileName);
        file.transferTo(desc);
        String pathFileName = FileUploadUtils.getPathFileName(baseDir, fileName);
        return pathFileName;
    }

    /**
     * 获取同目录下同名文件
     *
     * @param indexId
     * @param fileName
     * @return
     */
    @Override
    public SysFileDomain selectByFileName(Long indexId, String fileName) {
        return sysFileMapper.selectByFileName(indexId,fileName);
    }

    /**
     * 根据id获取文件
     *
     * @param fileIds
     * @return
     */
    @Override
    public List<SysFileDomain> selectByIds(String fileIds) {
        return sysFileMapper.selectByIds(fileIds);
    }

    /**
     * 通过id集合进行过滤
     *
     * @param fileDomain
     * @param fileIds
     * @return
     */
    @Override
    public List<SysFileDomain> selectListWithChildEx(SysFileDomain fileDomain, String fileIds) {
        return sysFileMapper.selectListWithChildEx(fileDomain,fileIds);
    }

    /**
     * 通过id集合进行过滤
     *
     * @param fileDomain
     * @param fileIds
     * @return
     */
    @Override
    public List<SysFileDomain> selectListEx(SysFileDomain fileDomain, String fileIds) {
        return sysFileMapper.selectListEx(fileDomain,fileIds);
    }
}